package core.database;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Set;

public class DataBaseParoleManager extends DataBaseManager {
	private static ResultSet rs;
	private static Set<String> paroleAmmesse = new HashSet<String>(); // contine
																		// le
																		// parole
																		// ammesse
																		// a
																		// partire
																		// da
																		// una
																		// generata
																		// a
																		// caso

	/**
	 * Costruttore che stabilisce la connessione tra codice java e database.
	 * Usato una tabella 'ParoleAmmesse' creata nel database presente su MySQL
	 * 'm-health'
	 * 
	 * @param url
	 * @param userName
	 *            : nome utente usato nella connessione creata con MySQL
	 * @param password
	 *            : password usata nella connessione creata con MySQL
	 * @throws SQLException
	 */

	private DataBaseParoleManager() {
	}

	/**
	 * Crea una tabella per il gioco GocceDiParole.
	 * 
	 * @throws SQLException
	 * @throws IOException
	 */
	public static void creaTabellaParoleAmmesse() throws SQLException,
			IOException {
		statement
				.execute("CREATE TABLE `m-health`.`ParoleAmmesse` (`idParola` INT NOT NULL AUTO_INCREMENT,`Parola` VARCHAR(60) NOT NULL,PRIMARY KEY (`idParola`),UNIQUE INDEX `ifParola_UNIQUE` (`idParola` ASC), UNIQUE INDEX `Parola_UNIQUE` (`Parola` ASC))");
		File elencoParole = new File("parole.txt");
		riempiDatabase(elencoParole);
	}

	/**
	 * Inizializza la tabella ParoleAmmesse (già creata da
	 * creaTabellaParoleAmmesse). Vengono inserite le parole presenti nel file
	 * testuale che viene passato come parametro. Questa operazione è piuttosto
	 * lunga visto che si deve scorrere tutto il file su disco. Nel caso del
	 * file parole.txt sono necessarie 60000 letture. Per il riempimento del
	 * database conviene importare il database da MySQL Workbench
	 * 
	 * @param elencoParole
	 * @throws IOException
	 * @throws SQLException
	 */
	public static void riempiDatabase(File elencoParole) throws IOException,
			SQLException {
		BufferedReader br = new BufferedReader(new FileReader(elencoParole));
		String currentWord = br.readLine();
		while (currentWord != null) {
			try { // se trova una parola non valida la salta
				statement.execute("INSERT INTO ParoleAmmesse(Parola) VALUES('"
						+ currentWord.toUpperCase() + "')");
				System.out.println("Inserito " + currentWord + " nel database");
			} catch (SQLException e) {
			}
			currentWord = br.readLine();
		}
		statement.close();
		br.close();

	}

	/**
	 * Esegue la query di ricerca della parola che corrisponde ad idParola
	 * 
	 * @param idParola
	 *            idParola generto in GocceDiParole da un random tra 1 e 60000
	 * @return
	 * @throws SQLException
	 */
	public static String searchWord(int idParola) throws SQLException {
		PreparedStatement ps = conn
				.prepareStatement("SELECT * FROM ParoleAmmesse LIMIT ?, 1");
		ps.setInt(1, idParola - 1);
		rs = ps.executeQuery();
		rs.next();
		String word = rs.getString(1); //la stringa della seconda colonna della tabella che risulta dalla ricerca
		ps.close();
		return word;
	}

	public static boolean buildWordSet(String randomWord) throws SQLException {
		rs = statement
				.executeQuery("SELECT * FROM ParoleAmmesse WHERE Parola LIKE '"
						+ randomWord + "%'");

		while (rs.next()) {
			paroleAmmesse.add(rs.getString(1));
		}
		System.out.println(paroleAmmesse.toString());
		return paroleAmmesse.size() >= 20;
		// ps.close();
	}

	/**
	 * Verifica se la parola inserita dall'utente è presente o meno nel database
	 * 
	 * @param word
	 * @return
	 * @throws SQLException
	 */
	public static boolean verifyWord(String word) throws SQLException {
		return paroleAmmesse.contains(word.toUpperCase());
	}
}
